//package xyz.erupt.flow.process.listener.impl.MonitorsImpl;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import lombok.var;
//import org.springframework.context.ApplicationContext;
//import org.springframework.expression.ExpressionParser;
//import org.springframework.expression.spel.standard.SpelExpressionParser;
//import org.springframework.expression.spel.support.StandardEvaluationContext;
//
//import javax.script.*;
//import java.io.BufferedReader;
//import java.io.IOException;
//import java.io.InputStreamReader;
//import java.io.OutputStream;
//import java.net.HttpURLConnection;
//import java.net.URL;
//import java.net.URLEncoder;
//import java.nio.charset.StandardCharsets;
//import java.util.Arrays;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.stream.Collectors;
//
//import xyz.erupt.flow.bean.entity.node.OaProcessNodeFormData;
//import xyz.erupt.flow.bean.entity.node.OaProcessNodeMonitor;
//import xyz.erupt.upms.service.EruptContextService;
//
///**
// * @author PP
// * @version 1.0
// * @project Erupt
// * @description 监听器工具
// * @date 2024/8/29 11:26:45
// */
//public class Utils {
//
//    //执行监听数据里的内容
//    public static void DoMonitor(OaProcessNodeMonitor data, OaProcessInstance instance, ApplicationContext applicationContext, EruptContextService eruptContextService){
//        var values = JSON.parseObject(instance.getFormItems());//获取表单数据作为变量,获取所有数据
//        var key_words = values.keySet(); //先转为键数组
//
//        //判断执行动作类型
//        switch (data.getType()){
//            case "Java":{
//                //执行java springEL语句,使用#变量名来提取表单中数据
//                var map = new HashMap<String,Object>();
//                key_words.forEach(s->map.put(s,values.get(s)));//循环添加数据，（格式如："field2020216994840": "你好监听"）
//                executeSpEL(data.getSpringEL(),map,applicationContext);
//                break;
//            }
//            case "JS":{
//                //后台执行JS语句
//                //将表单中变量全部注入ctx上下文中，通过如ctx.field4489789获取变量
//                SimpleBindings bindings = new SimpleBindings();
//                values.put("formName",instance.getFormName());
//                values.put("formId",instance.getFormId());
//                values.put("CreatorName",instance.getCreatorName());
//                values.put("FinishDate",instance.getFinishDate());
//                values.put("token",eruptContextService.getCurrentToken());//注入token
//                bindings.put("ctx",values);
//                //注入java.lang.System、cn.hutool.http.HttpRequest
////                var javaObjects = new HashMap<String,Object>();//创建导入类
////                javaObjects.put("JavaSystem",java.lang.System.class);
////                javaObjects.put("JavaHttpRequest",cn.hutool.http.HttpRequest.class);
////                bindings.putAll(javaObjects);
//                executeJavaScript(data.getJsData(),bindings);
//                break;
//            }
//            //变量替换规则${变量名}
//            case "Http":{
//                //后台执行Http请求
//                var httpData = data.getHttpData();//获取数据库中http数据
//                var headers = new HashMap<String,String>();
//                Arrays.stream(httpData.getHeaders()).forEach(s->headers.put(s.getHeaderName(),s.getHeaderValue()));
//                var formContentType = "application/x-www-form-urlencoded";
//                var jsonContentType = "application/json";
//                //注入表单变量用于替换
//                var map = new HashMap<String,String>();
//                key_words.forEach(s->map.put(s,values.getString(s)));//循环添加数据，（格式如："field2020216994840": "你好监听"）
//                map.put("token",eruptContextService.getCurrentToken());//注入token
//                var jsRequestInterceptor = new JsRequestInterceptor();
//
//                try {
//                    executeRequest(httpData.getMethod(),httpData.getUrl(),headers,
//                            httpData.getBody().getMode().equals("form")?httpData.getBody().getFormData():httpData.getBody().getJsonData()
//                            ,httpData.getBody().getMode().equals("form")?formContentType:jsonContentType,map,
//                            jsRequestInterceptor,httpData.getPreHandler(),httpData.getAftHandler());
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//                break;
//            }
//            default:
//                break;
//        }
////        System.out.println("测试流程启动时监听"+data);
//    }
//
//    // 执行 SpringEL 表达式
//    public static Object executeSpEL(String expression, Map<String,Object> variables,ApplicationContext applicationContext) {
//
//        // 创建一个 SpEL 表达式解析器
//        ExpressionParser parser = new SpelExpressionParser();
//
//        // 创建一个评估上下文（可以根据需要在上下文中添加变量）
//        StandardEvaluationContext context = new StandardEvaluationContext();
//
//        //将变量添加到上下文中
//        context.setVariables(variables);
//
//        //将bean添加到上下文中
//        context.setBeanResolver((ctx,beanName)->applicationContext.getBean(beanName));
//
//        // 解析并执行 SpEL 表达式
//        try {
//            Object result = parser.parseExpression(expression).getValue(context);
//            return result;
//        } catch (Exception e) {
//            System.err.println("执行 SpEL 表达式时出错: " + e.getMessage());
//            return null;
//        }
//    }
//    // 执行 JavaScript 代码，并注入 Java 对象和变量
//    public static Object executeJavaScript(String script, SimpleBindings bindings) {
//        // 创建一个 ScriptEngineManager
//        ScriptEngineManager manager = new ScriptEngineManager();
//
//        // 获取 Nashorn 引擎实例
//        ScriptEngine engine = manager.getEngineByName("nashorn");
//        if (engine == null) {
//            throw new UnsupportedOperationException("Nashorn engine is not available. Please use Java 8 or earlier.");
//        }
//
//        // 执行 JavaScript 代码
//        try {
//            Object result = engine.eval(script, bindings);
//            return result;
//        } catch (ScriptException e) {
//            System.err.println("执行 JavaScript 代码时出错: " + e.getMessage());
//            return null;
//        }
//    }
//    // 执行 JavaScript 代码
//    private static void executeJsCode(String script, Bindings bindings) throws Exception {
//        ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
//        engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
//        engine.eval(script);
//    }
//    // 替换占位符的方法
//    private static String replacePlaceholders(String text, Map<String, String> variables) {
//        String result = text;
//        if (text != null && variables != null) {
//            for (Map.Entry<String, String> entry : variables.entrySet()) {
//                String placeholder = "${" + entry.getKey() + "}";
//                result = result.replace(placeholder, entry.getValue());
//            }
//        }
//        return result;
//    }
//
//    // 发送 HTTP 请求
//    private static HttpURLConnection createConnection(String method, String url, Map<String, String> headers) throws IOException {
//        URL urlObject = new URL(url);
//        HttpURLConnection connection = (HttpURLConnection) urlObject.openConnection();
//        connection.setRequestMethod(method);
//
//        // 设置请求头
//        for (Map.Entry<String, String> entry : headers.entrySet()) {
//            connection.setRequestProperty(entry.getKey(), entry.getValue());
//        }
//
//        return connection;
//    }
//
//    // 执行 HTTP 请求
//    public static String executeRequest(String method, String url, Map<String, String> headers, Object body,
//                                        String contentType, Map<String, String> urlVariables,
//                                        RequestInterceptor interceptor, String preRequestJs, String postResponseJs) throws Exception {
//
//        // 替换 URL 和请求体中的占位符
//        String processedUrl = org.apache.commons.httpclient.util.URIUtil.encodeQuery(replacePlaceholders(url, urlVariables));
//        // 替换 headers 中的占位符
//        var new_headers = replaceHeadersPlaceholders(headers, urlVariables);
//        HttpURLConnection connection = createConnection(method, processedUrl, new_headers);
//        // 替换body
//        if(body instanceof String){//json数据
//            Map<String,String> datamap = new HashMap<>();
//            var data = JSONObject.parseObject(body.toString()).getInnerMap();
//            data.keySet().forEach(s->{datamap.put(s,data.get(s).toString());});
//            //替换
//            var map = replaceHeadersPlaceholders(datamap,urlVariables);
//            var jsonData = new JSONObject();
//            map.entrySet().forEach(s->{jsonData.put(s.getKey(),s.getValue());});
//            body = jsonData.toJSONString();
//
//        }else if(body instanceof List){//form表单
//            var data = (List<OaProcessNodeFormData>)body;
//            Map<String,String> datamap = new HashMap<>();
//            data.forEach(s->{datamap.put(s.getKey(),s.getValue());});
//            var new_data = replaceHeadersPlaceholders(datamap,urlVariables);
//            body = new_data;
//        }
//        // 设置内容类型
//        if (contentType != null) {
//            connection.setRequestProperty("Content-Type", contentType+";charset=utf-8");
//        }
//
//        // 执行请求前的 JavaScript 代码
//        if (interceptor != null) {
//            Bindings bindings = new SimpleBindings();
//            bindings.put("connection", connection);
//            bindings.put("headers", new_headers);
//            bindings.put("body",body instanceof String ?JSONObject.parseObject((String)body) : body);
//            var ctx = new HashMap<String, String>();
//            urlVariables.forEach((k,v)->{ctx.put(k,v);});
//            bindings.put("ctx",ctx);
//            executeJsCode(preRequestJs, bindings);
//            //如果js代码更新了内容则更新相应请求内容
//            if(bindings.containsKey("body")){
//                body = body instanceof String ? bindings.get("body").toString() : bindings.get("body");
//            }
//            if (bindings.containsKey("headers")) {
//                new_headers = (Map<String, String>) bindings.get("headers");
//            }
//            Map<String, String> encodedHeaders = new HashMap<>();
//            for (var entry : new_headers.entrySet()) {
//                String key = entry.getKey();
//                String value = entry.getValue();
//                // 使用 UTF-8 对 header value 进行 URL 编码
//                String encodedValue = URLEncoder.encode(value, StandardCharsets.UTF_8.toString());
//                encodedHeaders.put(key, encodedValue);
//            }
//            new_headers = encodedHeaders;
//            // 更新 HttpURLConnection 的设置
//            // 重新创建连接，应用修改后的 headers
//            connection = createConnection(method, processedUrl, new_headers);
//            connection.setRequestProperty("Charsert","UTF-8");
//            connection.setRequestProperty("Accept", "*/*");
//            if (contentType != null) {
//                connection.setRequestProperty("Content-Type", contentType+";charset=utf-8");
//            }
//        }
//
//        // 发送请求体
//        if (body != null && (method.equalsIgnoreCase("POST") || method.equalsIgnoreCase("PUT"))) {
//            connection.setDoOutput(true);
//            try (OutputStream os = connection.getOutputStream()) {
//                if (body instanceof String) {//json
//                    os.write(((String) body).getBytes(StandardCharsets.UTF_8));
//                } else if (body instanceof Map) {//form
//                    var data = buildFormData((Map<String, String>) body);
//                    os.write(data.getBytes(StandardCharsets.UTF_8));
//                } else {
//                    os.write(body.toString().getBytes(StandardCharsets.UTF_8));
//                }
//            }
//        }
//
//        // 获取响应
//        String response;
//        try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
//            StringBuilder responseBuilder = new StringBuilder();
//            String line;
//            while ((line = br.readLine()) != null) {
//                responseBuilder.append(line);
//            }
//            response = responseBuilder.toString();
//        }
//
//        // 执行响应后的 JavaScript 代码
//        if (interceptor != null) {
//            Bindings bindings = new SimpleBindings();
//            bindings.put("connection", connection);
//            bindings.put("response", response);
//            var ctx = new HashMap<String, String>();
//            urlVariables.forEach((k,v)->{ctx.put(k,v);});
//            bindings.put("ctx",ctx);
//            executeJsCode(postResponseJs, bindings);
//            // 如果 JS 代码修改了 response，则更新 response
//            if (bindings.containsKey("response")) {
//                response = bindings.get("response").toString();
//            }
//        }
//        connection.disconnect();//关闭连接
//        return response;
//    }
//
//
//    // 构建表单数据
//    private static String buildFormData(Map<String, String> formData) {
//        return formData.entrySet().stream()
//                .map(entry -> entry.getKey() + "=" + entry.getValue())
//                .collect(Collectors.joining("&"));
//    }
//    // 替换请求头中的占位符
//    private static Map<String, String> replaceHeadersPlaceholders(Map<String, String> headers, Map<String, String> urlVariables) {
//        Map<String, String> processedHeaders = new HashMap<>();
//        for (Map.Entry<String, String> entry : headers.entrySet()) {
//            String key = entry.getKey();
//            String value = null;
//            value = replacePlaceholders(entry.getValue(), urlVariables);
//            processedHeaders.put(key, value);
//        }
//        return processedHeaders;
//    }
//
//    // 拦截器接口
//    public interface RequestInterceptor {
//        void beforeRequest(HttpURLConnection connection, Map<String, String> headers, String body) throws Exception;
//        void afterResponse(HttpURLConnection connection, String response) throws Exception;
//    }
//
//
//}
